package com.ruoyi.demo.controller.queue;

import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.lang.Console;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.utils.redis.QueueUtils;
import com.ruoyi.demo.domain.TestDemo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;

/**
 * <简述>有界队列
 * <详细描述>
 *
 * @author syf
 * @date 2024年09月04日 10:33
 */
@RestController
@SaIgnore
public class QueueTestController {

    /**
     * <简述>添加队列
     * <详细描述>
     * @author syf
     * @date 2024/9/4 10:44
     */

    @GetMapping("addQueue")
    public void addQueue() {
        TestDemo testDemo = new TestDemo();
        testDemo.setTestKey("testKey");
        testDemo.setCreateTime(new Date());
        QueueUtils.addQueueObject("test", testDemo);
    }


    /**
     * <简述>获取队列
     * <详细描述>
     * @author syf
     * @date 2024/9/4 10:45
     */
    @GetMapping("getQueue")
    public void getQueue() {
        TestDemo testDemo = new TestDemo();
        testDemo.setTestKey("testKey");
        testDemo.setCreateTime(new Date());
        Object test = QueueUtils.getQueueObject("test");
        Console.log("test->{}", test);
    }

    @GetMapping("removeQueue")
    public R<Void> removeQueue() throws ParseException {
        TestDemo testDemo = new TestDemo();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        testDemo.setCreateTime(simpleDateFormat.parse("2024-09-04 10:40:53"));
        testDemo.setTestKey("testKey");
        boolean test = QueueUtils.removeQueueObject("test", testDemo);
       return R.ok(test ? "成功":"失败");
    }

    /**
     * <简述>销毁
     * <详细描述>
     * @author syf
     * @date 2024/9/4 11:26
     * @return com.ruoyi.common.core.domain.R<java.lang.Void>
     */

    @GetMapping("destoryQueue")
    public R<Void> destoryQueue() throws ParseException {
        boolean test = QueueUtils.destroyQueue("test");
        return R.ok(test ? "成功":"失败");
    }

    /**
     * <简述>订阅队列
     * <详细描述>当前队列有数据时，会立即执行
     * @author syf
     * @date 2024/9/4 11:27
     */
   @GetMapping("subscribeQueue")
    //@PostConstruct
    public void subscribeQueue() {
        QueueUtils.subscribeBlockingQueue("test",(Consumer<TestDemo>) testDemo ->{
            Console.log("testDemo->{}", testDemo);
        },false);
    }

    /**********************有界队列*************************************/

    /**
     * <简述>设置有界队列
     * <详细描述>
     * @author syf
     * @date 2024/9/5 15:21
     */
    @GetMapping("addBoundedQueue")
    public void addBoundedQueue() {
        //销毁队列
        QueueUtils.destroyQueue("test");
        //设置队列容量
        QueueUtils.trySetBoundedQueueCapacity("test", 5);
    }




    /**
     * <简述>添加有界队列
     * <详细描述>
     * @author syf
     * @date 2024/9/5 15:29
     */
    @GetMapping("addBounded")
    public R<Void> addBounded() {
        //设置队列容量
        boolean test = QueueUtils.addBoundedQueueObject("test", "vlue111");
        return R.ok(test ? "成功":"失败");
    }

    /**
     * <简述>获取队列
     * <详细描述>
     * @author syf
     * @date 2024/9/5 19:17
     * @return com.ruoyi.common.core.domain.R<java.lang.Void>
     */
    @GetMapping("getBounded")
    public R<Void> getBounded() {
        Object test = QueueUtils.getBoundedQueueObject("test");
        return R.ok(test.toString());
    }

    /**************************************延时对了*******************************************/

    /**
     * <简述>订阅延时队列
     * <详细描述>
     * @author syf
     * @date 2024/9/6 14:53
     */
    @GetMapping("subscribeDelayQueue")
    public R<Void> subscribeDelayQueue() {
        Console.log("开启监听。。。。。。。。。。。。。。。。。。。。。。。。。。。");
        QueueUtils.subscribeBlockingQueue("test",(Consumer<TestDemo>) testDemo  ->{
            Console.log("接受到订单->{}", testDemo);

            Console.log("关闭订单");
        },false);
        return R.ok();
    }

   /**
    * <简述>添加延时队列
    * <详细描述>
    * @author syf
    * @date 2024/9/6 15:06
    */
   @GetMapping("addDelayQueue")
   public void addDelayQueue() throws ParseException {
       Console.log("创建订单。。。。。。。。。。。。。。。。。。。");
       TestDemo testDemo = new TestDemo();
       testDemo.setValue("订单编号");
       QueueUtils.addDelayedQueueObject("test", testDemo, 10, TimeUnit.SECONDS);
       Console.log("等待10秒。。。。。。。。。。。。。。。。。。。");
   }

}
